# -*- coding: utf-8 -*-
"""
Author: chen xi
Date: 2025/4/30 上午11:27
File: user_action.py
"""
import json
import os
import time
from app_flow_graph import AppFlowGraph
from com.config_utils import find_directory, read_config
from com.logging_utils import Logger
from ui_action import UIAction
from decorators.popup_handler import handle_popups


# from decorators.performance import timing_decorator


class AppNavigator(AppFlowGraph, UIAction):
	
	def __init__(self,
	             app_name: str,
	             android_device_id=None):
		"""
		初始化应用程序自动化控制器，加载配置并初始化相关功能模块。

		参数:
			app_name (str): 要操作的应用程序名称，用于从配置文件中读取对应信息。
			android_device_id (str, optional): Android 设备的唯一标识符（如序列号），
											   用于多设备场景下的设备指定，默认为 None。
		"""
		
		# 构建配置文件路径：在项目中查找名为 "config" 的目录，并拼接配置文件 "app_config.ini"
		config_path = os.path.join(find_directory("config"), "app_config.ini")
		
		# 使用自定义函数读取配置文件内容，返回一个 ConfigParser 类型的对象
		config_parser = read_config(config_path)
		
		# 从配置文件中获取当前应用的包名（APP_PACKAGE_NAME），用于后续 UI 自动化操作
		app_package_name = config_parser.get(section=app_name, option="APP_PACKAGE_NAME")
		
		# 初始化 AppFlowGraph 类（页面导航图管理模块）
		# 作用：构建或加载 APP 页面之间的跳转关系图，用于智能导航
		AppFlowGraph.__init__(self, config_parser, app_name)
		
		# 初始化 UIAction 类（UI 操作封装模块）
		# 作用：封装点击、输入等 UI 自动化操作，支持与 APP 进行交互
		UIAction.__init__(self, app_package_name, android_device_id)
	
	def get_current_page(self):
		"""
		获取当前显示页面的名称。

		流程：
			1. 使用 dump_hierarchy 方法从设备获取当前页面的层次结构内容。
			2. 根据获取到的页面内容计算信任分数最高的页面名称。
			3. 返回计算得到的当前页面名称。

		返回:
			str: 当前显示页面的名称。
		"""
		
		# 使用 dump_hierarchy 方法获取当前页面的层次结构内容，并将其存储在 page_content 变量中
		# 这一步骤主要是为了获取当前界面的所有UI元素信息，以便后续分析
		page_content = self.driver.dump_hierarchy()
		
		# 调用 calculate_page_trust_scores 方法，并传入 page_content 作为参数
		# 此方法将基于页面内容计算出一个或多个可能的页面名称及其信任分数，并返回信任分数最高的页面名称
		current_page_name = self.calculate_page_trust_scores(page_content)
		
		# 返回计算得到的信任分数最高的页面名称
		return current_page_name
	
	def navigate_to_page(self, *args):
		"""
		根据指定的目标页面名称自动导航至目标页面，并执行必要的交互操作。

		参数:
			*args: 可变参数列表。
				- 第一个参数为目标页面名称（字符串）。
				- 后续参数为需要输入的内容（如文本、数字等）。
		"""
		# 获取当前页面名称
		current_page = self.get_current_page()
		
		# 目标页面名称
		target_page = args[0]
		
		# 如果已经在目标页面，则无需进一步操作
		if current_page == target_page:
			return
		
		# 计算从当前页面到目标页面的最短路径
		navigation_path = self.find_shortest_path_between_pages(start_node=current_page, end_node=target_page)
		remaining_args = args[1:]  # 移除第一个参数（目标页面），保留后续参数
		
		UI_ELEMENTS = json.loads(self.app_config.get("UIControls", "UI_ELEMENTS"))
		
		# 遍历路径中的每个步骤并执行相应的操作
		for step in navigation_path:
			input_content = None
			
			Logger.info(F"remaining_args:{remaining_args}")
			
			# 如果该控件类型需要输入内容且还有未使用的参数，则使用下一个参数作为输入内容
			if step['控件类型'] in UI_ELEMENTS and len(remaining_args) >= 1:
				input_content = remaining_args[0]
				remaining_args = remaining_args[1:]
				Logger.info(F"remaining_args:{remaining_args}")
			
			# 将原始数据反序列化为字典结构
			step["raw"] = json.loads(step["raw"])
			
			# 打印操作步骤和内容（用于调试）
			Logger.info(f"{step}")
			Logger.info(f"{input_content}\t{step['控件类型']}")
			
			# 执行点击或输入操作
			self.execute_action(step, input_content)
			
			# 等待操作完成
			wait_time = 1.0
			if step.get("等待时间") == step.get("等待时间"):
				wait_time = int(step.get("等待时间"))
			time.sleep(wait_time)


if __name__ == "__main__":
	app = AppNavigator("睿博士")
	time.sleep(15)
	app.navigate_to_page("卡回放", "XT5N")
	time.sleep(10)
# app.get_current_page()
